#!/bin/bash

# 配置
CHILLHOP_FILE="chillhop.txt"
PLAYER="mpg123"  # 需支持交互控制（mpg123/mpg321）
SKIP_FILE="/tmp/chillhop_skip"
PAUSE_FILE="/tmp/chillhop_pause"
TEMP_FILE=""  # 用于记录当前播放的临时文件路径
PLAYER_PID=0  # 用于记录播放器进程ID

# 清理函数：确保退出时删除所有临时文件
cleanup() {
    # 停止播放器进程（如果存在）
    if [ $PLAYER_PID -ne 0 ]; then
        kill $PLAYER_PID &> /dev/null
    fi
    # 删除临时音频文件（如果存在）
    if [ -n "$TEMP_FILE" ] && [ -f "$TEMP_FILE" ]; then
        rm -f "$TEMP_FILE"
    fi
    # 清理控制文件和管道
    rm -f "$SKIP_FILE" "$PAUSE_FILE" /tmp/mpg123_control
    echo -e "\n===== 已清理临时文件，感谢收听！====="
    exit 0
}

# 检查依赖和文件
check_dependencies() {
    if [ ! -f "$CHILLHOP_FILE" ]; then
        echo "错误：未找到 $CHILLHOP_FILE 文件"
        exit 1
    fi
    if ! command -v "$PLAYER" &> /dev/null; then
        echo "错误：未安装播放器 $PLAYER（需支持交互控制）"
        exit 1
    fi
    if ! command -v curl &> /dev/null; then
        echo "错误：未安装 curl"
        exit 1
    fi
}

# 随机选择一首歌曲
select_random_track() {
    RANDOM_LINE=$(grep -v '^$' "$CHILLHOP_FILE" | shuf -n 1)
    TRACK_ID=$(echo "$RANDOM_LINE" | cut -d '!' -f 1)
    TRACK_NAME=$(echo "$RANDOM_LINE" | cut -d '!' -f 2-)
}

# 播放单首歌曲
play_track() {
    # 生成临时文件并记录路径（用于后续清理）
    TEMP_FILE=$(mktemp --suffix=".mp3")
    echo -e "\n===== 正在下载：$TRACK_NAME（ID: $TRACK_ID）====="
    
    # 下载音频（带进度条）
    if ! curl -# "https://stream.chillhop.com/mp3/$TRACK_ID" -o "$TEMP_FILE"; then
        echo "下载失败，尝试下一首..."
        rm -f "$TEMP_FILE"
        TEMP_FILE=""  # 清空无效文件路径
        return 1
    fi

    echo -e "\n===== 开始播放：$TRACK_NAME ====="
    echo "操作：按 s 跳过 | 按 p 暂停/继续 | 按 Ctrl+C 退出"

    # 创建控制管道（用于向播放器发送命令）
    mkfifo /tmp/mpg123_control
    # 启动播放器并记录进程ID
    $PLAYER -C "$TEMP_FILE" < /tmp/mpg123_control &
    PLAYER_PID=$!
    rm -f "$SKIP_FILE"  # 清除历史跳过信号

    # 监听用户输入（s/p）
    while kill -0 $PLAYER_PID 2>/dev/null; do
        if [ -f "$SKIP_FILE" ]; then
            # 发送 'q' 命令退出播放器（跳过）
            echo "q" > /tmp/mpg123_control
            rm -f "$SKIP_FILE"
            echo -e "\n===== 已跳过当前歌曲 ====="
            break
        elif [ -f "$PAUSE_FILE" ]; then
            # 发送 'p' 命令切换暂停/继续
            echo "p" > /tmp/mpg123_control
            rm -f "$PAUSE_FILE"
            # 显示当前状态
            if ps -p $PLAYER_PID -o state --no-headers | grep -q 'T'; then
                echo "===== 已暂停（按 p 继续） ====="
            else
                echo "===== 已继续播放 ====="
            fi
        fi
        sleep 0.2
    done

    # 播放结束后清理当前临时文件
    rm -f "$TEMP_FILE" /tmp/mpg123_control
    TEMP_FILE=""
    PLAYER_PID=0
    return 0
}

# 主循环
main() {
    check_dependencies
    # 捕获 Ctrl+C 信号，触发清理函数
    trap cleanup SIGINT
    echo "===== Chillhop 播放器 ====="
    echo "启动成功！操作说明："
    echo "- 按 s + 回车：跳过当前歌曲"
    echo "- 按 p + 回车：暂停/继续播放"
    echo "- 按 Ctrl+C：退出并清理文件"

    # 后台监听用户输入（s/p）
    while true; do
        read -r input
        case "$input" in
            s) touch "$SKIP_FILE" ;;
            p) touch "$PAUSE_FILE" ;;
        esac
    done &
    local input_listener_pid=$!

    # 循环播放
    while true; do
        select_random_track
        play_track
    done

    # 理论上不会执行到这里，保险起见清理后台进程
    kill $input_listener_pid &> /dev/null
    cleanup
}

# 启动程序
main
